package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.model.album.BaseAttribute;
import com.atguigu.tingshu.model.album.BaseCategory1;
import com.atguigu.tingshu.model.album.BaseCategory3;
import com.atguigu.tingshu.model.album.BaseCategoryView;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@SuppressWarnings({"all"})
public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1> implements BaseCategoryService {

	@Autowired
	private BaseCategory1Mapper baseCategory1Mapper;

	@Autowired
	private BaseCategory2Mapper baseCategory2Mapper;

	@Autowired
	private BaseCategory3Mapper baseCategory3Mapper;


	@Autowired
	private BaseCategoryViewMapper baseCategoryViewMapper;

	@Autowired
	private BaseAttributeMapper baseAttributeMapper;

	/**
	 * 根据三级分类ID获取分类视图
	 *
	 * 此方法通过接收一个三级分类的ID来获取相应的分类视图对象
	 * 它直接调用了MyBatis映射接口中的selectById方法来实现这一点
	 *
	 * @param category3Id 三级分类ID，用于标识特定的分类
	 * @return 返回对应的分类视图对象，如果找不到则返回null
	 */
	@Override
	public BaseCategoryView getCategoryView(Long category3Id) {
	    return baseCategoryViewMapper.selectById(category3Id);
	}

	/**
	 * 根据一级分类ID查找属性
	 *
	 * @param category1Id 一级分类的ID
	 * @return 返回与指定一级分类ID相关的属性列表
	 */
	@Override
	public List<BaseAttribute> findAttribute(Long category1Id) {
	    return baseAttributeMapper.findAttribute(category1Id);
	}


	/**
	 * 选择类别1的列表
	 *
	 * 此方法通过调用baseCategory1Mapper的selectList方法，来获取所有类别1的记录
	 * 它不接受任何参数，因为它获取的是所有记录，不需要任何过滤条件
	 *
	 * @return 返回BaseCategory1对象的列表，包含所有类别1的信息
	 */
	@Override
	public List<BaseCategory1> selectCategory1List() {
	    // 调用baseCategory1Mapper的selectList方法，获取所有BaseCategory1的记录
	    List<BaseCategory1> baseCategory1List = baseCategory1Mapper.selectList(null);
	    // 返回获取到的BaseCategory1列表
	    return baseCategory1List;
	}

	/**
	 * 根据一级分类ID查询顶级二级分类
	 *
	 * @param category1Id 一级分类ID
	 * @return 包含顶级二级分类的BaseCategory3列表
	 */
	@Override
	public List<BaseCategory3> findTopBaseCategory3(Long category1Id) {
	    // 查询与一级分类ID关联的所有二级分类视图列表
	    List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(
	            new LambdaQueryWrapper<BaseCategoryView>().eq(BaseCategoryView::getCategory1Id, category1Id));

	    // 提取二级分类ID并收集到列表中
	    List<Long> category2IdList = baseCategoryViewList.stream().map(BaseCategoryView::getCategory2Id).collect(Collectors.toList());

	    // 查询二级分类ID在category2IdList中且置顶状态为1的顶级二级分类，限制返回结果为7条
	    return baseCategory3Mapper.selectList(
	            new LambdaQueryWrapper<BaseCategory3>().in(BaseCategory3::getCategory2Id, category2IdList)
	            .eq(BaseCategory3::getIsTop, 1).last("limit 7"));
	}

	/**
	 * 根据一级分类ID获取分类列表的JSON对象
	 *
	 * @param category1Id 一级分类ID
	 * @return 包含分类信息的JSONObject
	 */
	@Override
	public JSONObject getCategoryList(Long category1Id) {
	    // 初始化一级分类的JSONObject
	    JSONObject category1 = new JSONObject();

	    // 通过一级分类ID查询所有基础分类视图列表
	    List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(
	        new LambdaQueryWrapper<BaseCategoryView>().eq(BaseCategoryView::getCategory1Id, category1Id)
	    );

	    // 设置一级分类的ID和名称
	    category1.put("categoryId", category1Id);
	    category1.put("categoryName", baseCategoryViewList.get(0).getCategory1Name());

	    // 初始化二级分类的JSONObject列表
	    ArrayList<JSONObject> category2List = new ArrayList<>();

	    // 按二级分类ID分组基础分类视图列表
	    Map<Long, List<BaseCategoryView>> category2Map = baseCategoryViewList.stream().collect(
	        Collectors.groupingBy(BaseCategoryView::getCategory2Id)
	    );

	    // 遍历二级分类Map
	    Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator = category2Map.entrySet().iterator();
	    while (iterator.hasNext()) {
	        Map.Entry<Long, List<BaseCategoryView>> entry = iterator.next();
	        Long category2Id = entry.getKey();
	        List<BaseCategoryView> baseCategoryViewList2 = entry.getValue();

	        // 初始化二级分类的JSONObject
	        JSONObject category2 = new JSONObject();
	        category2.put("categoryId", category1Id);
	        category2.put("categoryName", baseCategoryViewList2.get(0).getCategory1Name());

	        // 初始化三级分类的JSONObject
	        JSONObject category3 = new JSONObject();

	        // 创建三级分类列表
	        List<JSONObject> category3List = baseCategoryViewList2.stream().map(map -> {
	            category3.put("categoryId", map.getCategory3Id());
	            category3.put("categoryName", map.getCategory3Name());
	            return category3;
	        }).toList();

	        // 将三级分类列表添加到二级分类中
	        category2.put("categoryChild", category3List);

	        // 将二级分类添加到一级分类中
	        category2List.add(category2);
	    }

	    // 将二级分类列表添加到一级分类中
	    category1.put("categoryChild", category2List);

	    // 返回一级分类的JSONObject
	    return category1;
	}

	@Override
	public List<JSONObject> getCategoryList() {
	    // 获取一级分类集合
	    List<JSONObject> category1List = new ArrayList<>();
	    // 查询所有分类数据
	    List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(null);
	    // 按一级分类分组
	    Map<Long, List<BaseCategoryView>> category1Map = baseCategoryViewList.stream()
	            .collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
	    // 遍历一级分类
	    Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator = category1Map.entrySet().iterator();
	    while (iterator.hasNext()) {
	        Map.Entry<Long, List<BaseCategoryView>> entry = iterator.next();
	        Long category1Id = entry.getKey();
	        List<BaseCategoryView> baseCategoryViewList1 = entry.getValue();
	        // 创建一级分类对象
	        JSONObject category1 = new JSONObject();
	        category1.put("categoryId", category1Id);
	        category1.put("categoryName", baseCategoryViewList1.get(0).getCategory1Name());
	        // 按二级分类分组
	        Map<Long, List<BaseCategoryView>> category2map = baseCategoryViewList1.stream()
	                .collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
	        // 创建二级分类集合
	        ArrayList<JSONObject> category2List = new ArrayList<>();
	        // 遍历二级分类
	        Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator2 = category2map.entrySet().iterator();
	        while (iterator2.hasNext()) {
	            Map.Entry<Long, List<BaseCategoryView>> entry1 = iterator2.next();
	            Long category2Id = entry1.getKey();
	            List<BaseCategoryView> baseCategoryViewList2 = entry1.getValue();
	            // 创建二级分类对象
	            JSONObject category2 = new JSONObject();
	            category2.put("categoryId", category2Id);
	            category2.put("categoryName", baseCategoryViewList2.get(0).getCategory2Name());
	            // 创建三级分类集合
	            List<JSONObject> category3List = baseCategoryViewList2.stream().map(baseCategoryView -> {
	                JSONObject category3 = new JSONObject();
	                category3.put("categoryId", baseCategoryView.getCategory3Id());
	                category3.put("categoryName", baseCategoryView.getCategory3Name());
	                return category3;
	            }).toList();
	            // 为二级分类添加三级分类集合
	            category2.put("categoryChild", category3List);
	            // 将二级分类添加到二级分类集合
	            category2List.add(category2);
	        }
	        // 为一级分类添加二级分类集合
	        category1.put("categoryChild", category2List);
	        // 将一级分类添加到一级分类集合
	        category1List.add(category1);
	    }
	    return category1List;
	}
}
